package com.atguigu.demojuc.chap07;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueDemo {

    public static void main(String[] args) throws InterruptedException {

        //创建有界阻塞队列
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(3);

        // 第一组方法：add remove element
        System.out.println(queue.add("a")); //入队,正常则返回true
        System.out.println(queue.add("b"));
        System.out.println(queue.add("c"));
        // System.out.println(queue.add("d")); //队列已满仍然入队，报异常
        System.out.println(queue.element()); //获取队列中的第一个元素，并返回
        System.out.println(queue.remove()); //出队第一个元素，返回出队元素
        System.out.println(queue.remove());
        System.out.println(queue.remove());
        //System.out.println(queue.remove()); //队列已空仍然出队，报异常
        //System.out.println(queue.element()); //队列已空仍然获取元素，报异常


        // 第二组：offer poll peek
        /*System.out.println(queue.offer("a")); //入队,正常则返回true
        System.out.println(queue.offer("b"));
        System.out.println(queue.offer("c"));
        System.out.println(queue.offer("d")); //队列已满仍然入队, 返回false
        System.out.println(queue.peek()); //获取队列中的第一个元素，并返回
        System.out.println(queue.poll()); //出队第一个元素，返回出队元素
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll()); //队列已空仍然出队，返回null
        System.out.println(queue.peek());  //队列已空仍然获取元素，返回null*/

        // 第三组：put take
        /*queue.put("a"); //入队
        queue.put("b");
        queue.put("c");
        System.out.println(queue.take()); //出队第一个元素，返回出队元素，则后面代码不会阻塞
        queue.put("d"); //队列已满仍然入队, 发生阻塞
        System.out.println(queue.take()); //出队第一个元素，返回出队元素
        System.out.println(queue.take());
        System.out.println(queue.take());
        System.out.println(queue.take()); //队列已空仍然出队，发生阻塞*/

        // 第四组：offer poll
        /*System.out.println(queue.offer("a")); //入队,正常则返回true
        System.out.println(queue.offer("b"));
        System.out.println(queue.offer("c"));
        System.out.println(queue.offer("d", 5, TimeUnit.SECONDS)); //队列已满仍然入队,超时返回false
        System.out.println(queue.poll()); //出队第一个元素，返回出队元素
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll(5, TimeUnit.SECONDS)); //队列已空仍然出队，,超时返回null*/
    }
}